package uiMain;

import gestorbienraizok.usuarios.Cita;
import gestorbienraizok.usuarios.Cliente;
import gestorbienraizok.usuarios.ClienteAnonimo;
import gestorbienraizok.usuarios.ClienteDemandador;
import gestorbienraizok.usuarios.ClienteOferente;
import gestorbienraizok.usuarios.Funcionario;
import gestorbienraizok.usuarios.Persona;
import static uiMain.bienRaizOk.entrada;
import static uiMain.bienRaizOk.listaDeClientesAnonimos;
import static uiMain.bienRaizOk.listaDePersonas;
import static uiMain.bienRaizOk.usuarioActual;

public class OpcionPedirCita extends OpcionDeMenu {

    private String nombreParaMostrar = " Pedir una cita con un funcionario";

    @Override
    public void ejecutar() {
        Persona estaPersona = null;
        if (usuarioActual == null) {
            System.out.print("Ingrese su número de cédula: ");
            long cedula = entrada.nextLong();
            while (cedula < 0) {
                System.out.print("Ingrese una cédula válida: ");
                cedula = entrada.nextLong();
            }

            estaPersona = Persona.buscarPersona(cedula);

            if (estaPersona != null) {
                if (estaPersona instanceof Funcionario) {
                    System.out.println("Usted ya está registrado como funcionario");
                } else if (estaPersona instanceof ClienteOferente) {
                    System.out.println("Usted ya está registrado como cliente oferente. Comuníquese con un funcionario");
                } else if (estaPersona instanceof ClienteDemandador) {
                    ClienteDemandador esteClienteDemandador = (ClienteDemandador) estaPersona;
                    System.out.println("Usted ya está registrado como cliente demandador. Comuníquese con su asesor (" + esteClienteDemandador.getFuncionario().getNombre() + ").");
                } else if (estaPersona instanceof Cliente) {
                    System.out.println("Usted ya está registrado como cliente sin rol. Comuníquese con un funcionario");
                } else {
                    System.out.println("Usted ya está registrado como administrador del sistema");
                }
            } else if (ClienteAnonimo.yaEsAnonimo(cedula)) {
                System.out.println("Usted ya tiene una cita.");
            } else {
                System.out.print("Ingrese su nombre: ");
                entrada.nextLine();
                String nombre = entrada.nextLine();

                byte motivoCita;
                do {
                    System.out.print("Ingrese el motivo de su cita: Arrendar (1), Comprar (2), Consignar una propiedad (3): ");
                    motivoCita = entrada.nextByte();
                } while (motivoCita < 1 || motivoCita > 3);

                ClienteAnonimo nuevoClienteAnonimo = new ClienteAnonimo(cedula, nombre);
                Cita nuevaCita = new Cita(nuevoClienteAnonimo, motivoCita);
                Funcionario esteFuncionario = Funcionario.funcionarioAleatorio();

                String horaDeLaCita = esteFuncionario.proximaCitaDisponible(nuevaCita);
                if (!horaDeLaCita.equals("")) {
                    System.out.println("Su cita quedó programada con el funcionario " + esteFuncionario.getNombre() + " a las " + horaDeLaCita);
                    listaDeClientesAnonimos.add(nuevoClienteAnonimo);
                    return;
                } else {
                    for (int i = 0; i < listaDePersonas.size(); i++) {
                        estaPersona = listaDePersonas.get(i);
                        if (estaPersona instanceof Funcionario) {
                            esteFuncionario = (Funcionario) estaPersona;
                            horaDeLaCita = esteFuncionario.proximaCitaDisponible(nuevaCita);
                            if (!horaDeLaCita.equals("")) {
                                System.out.println("Su cita quedó programada con el funcionario " + esteFuncionario.getNombre() + " a las " + horaDeLaCita);
                                listaDeClientesAnonimos.add(nuevoClienteAnonimo);
                                return;
                            }
                        }
                    }
                    System.out.println("Lo sentimos. Todos los funcionarios tienen su agenda llena.");
                    return;
                }
            }
        } else if (usuarioActual instanceof ClienteDemandador) {
            byte motivoCita;
            do {
                System.out.print("Ingrese el motivo de su cita: Arrendar (1), Comprar (2), Consignar una propiedad (3): ");
                motivoCita = entrada.nextByte();
            } while (motivoCita < 1 || motivoCita > 3);
            Cita nuevaCita = new Cita(new ClienteAnonimo(usuarioActual.getCedula(), usuarioActual.getNombre()), motivoCita);
            ClienteDemandador esteUsuario = (ClienteDemandador) usuarioActual;
            String horaDeLaCita = esteUsuario.getFuncionario().proximaCitaDisponible(nuevaCita);

            if (!horaDeLaCita.equals("")) {
                System.out.println("Su cita quedó programada con su funcionario (" + esteUsuario.getFuncionario().getNombre() + ") a las " + horaDeLaCita);
                return;
            } else {
                System.out.println("Lo sentimos. Su funcionario tiene la agenda llena.");
                return;
            }
        } else if (usuarioActual instanceof ClienteOferente) {
            byte motivoCita;
            do {
                System.out.print("Ingrese el motivo de su cita: Arrendar (1), Comprar (2), Consignar una propiedad (3): ");
                motivoCita = entrada.nextByte();
            } while (motivoCita < 1 || motivoCita > 3);

            Cita nuevaCita = new Cita(new ClienteAnonimo(usuarioActual.getCedula(), usuarioActual.getNombre()), motivoCita);
            Funcionario esteFuncionario = Funcionario.funcionarioAleatorio();
            String horaDeLaCita = esteFuncionario.proximaCitaDisponible(nuevaCita);

            if (!horaDeLaCita.equals("")) {
                System.out.println("Su cita quedó programada con el funcionario " + esteFuncionario.getNombre() + " a las " + horaDeLaCita);
                return;
            } else {
                for (int i = 0; i < listaDePersonas.size(); i++) {
                    estaPersona = listaDePersonas.get(i);
                    if (estaPersona instanceof Funcionario) {
                        esteFuncionario = (Funcionario) estaPersona;
                        horaDeLaCita = esteFuncionario.proximaCitaDisponible(nuevaCita);
                        if (!horaDeLaCita.equals("")) {
                            System.out.println("Su cita quedó programada con el funcionario " + esteFuncionario.getNombre() + " a las " + horaDeLaCita);
                            return;
                        }
                    }
                }
                System.out.println("Lo sentimos. Todos los funcionarios tienen su agenda llena.");
                return;
            }
        }

    }

    @Override
    public String toString() {
        return nombreParaMostrar;
    }

    @Override
    public String toStringParaMostrarElNivel() {
        return nombreParaMostrar.trim().concat("...................................................................").substring(0, 67) + "Usuarios no registrados";
    }

}
